/*
给定一个长度为 N 的数列，求数值严格单调递增的子序列的长度最长是多少。

输入格式
第一行包含整数 N。

第二行包含 N 个整数，表示完整序列。

输出格式
输出一个整数，表示最大长度。

数据范围
1≤N≤100000，
−109≤数列中的数≤109
输入样例：
7
3 1 2 1 8 5 6
输出样例：
4
*/
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;

const int N = 1010;
int a[N], f[N], g[N]; //分别记录 原数组 当前位置的最长子序列 状态转移路径
int main(int argc, char const *argv[])
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int i = 1; i <= n; i++)
    {
        f[i] = 1;
        g[i] = 0;
        for (int j = 1; j < i; j++)
        {
            if (a[j] < a[i])
                if (f[i] < f[j] + 1)
                {
                    f[i] = f[j] + 1;
                    g[i] = j;
                }
        }
    }
    int k = 0;
    for (int i = 1; i <= n; i++)
        if (f[k] < f[i])
            k = i;
    cout << f[k] << endl;
    // for(int i=1; i<=n;i++)
    //     cout<<g[i]<<" ";
    // cout<<endl;
    stack<int> st;
    for (int i = 0, len = f[k]; i < len; i++)
    {
        // cout << a[k] << " ";
        st.push(a[k]);
        k = g[k];
    }
    for (int i = 0, len = st.size(); i < len; i++)
    {
        int t = st.top();
        st.pop();
        cout << t << " ";
    }
    return 0;
}
